import xml.etree.ElementTree as ET
import openpyxl
from openpyxl.styles import Alignment, Font

def extract_attributes_to_excel(xml_file_path, excel_file_path):
    # 解析XML文件
    tree = ET.parse(xml_file_path)
    root = tree.getroot()

    # 创建一个Excel工作簿
    workbook = openpyxl.Workbook()

    # 处理Sheet1
    active_sheet1 = workbook.active
    active_sheet1.title = "C_Cpp_test_Overview"

    # 添加sheet1的列名
    active_sheet1.cell(row=2, column=1, value="项目名")
    active_sheet1.cell(row=2, column=2, value="扫描文件数量")
    active_sheet1.cell(row=2, column=3, value="扫描行数")
    active_sheet1.cell(row=2, column=4, value="违规总数")

    # 设置A到D列的宽度为20
    for col in range(1, 5):
        active_sheet1.column_dimensions[openpyxl.utils.get_column_letter(col)].width = 20

    # 找到project节点
    project_node = root.find("./CodingStandards/Projects/Project")

    # 获取Project节点的name属性值
    if project_node is not None:
        # 获取project节点的name属性的值
        project_name = project_node.get("name")
        # 获取project节点的totFiles属性的值
        scan_files_numbers = project_node.get("totFiles")
        # 获取project节点的totLns属性的值
        scan_lines_numbers = project_node.get("totLns")
        # 获取project节点的totErrs属性的值
        total_errors_numbers = project_node.get("totErrs")

        # 合并第一行的第一列到第四列
        active_sheet1.merge_cells('A1:D1')
        # 设置合并后单元格的内容
        active_sheet1['A1'] = 'Parasoft C/C++test测试报告'
        # 设置合并后单元格的内容居中
        active_sheet1['A1'].alignment = Alignment(horizontal='center', vertical='center')
        # 设置字体的大小和加粗
        active_sheet1['A1'].font = Font(size=20, bold=True)

        # 将项目名写入sheet1的第一列
        active_sheet1.cell(row=3, column=1, value=project_name)
        # 将文件数量写入sheet1的第二列
        active_sheet1.cell(row=3, column=2, value=scan_files_numbers)
        # 将扫描行数写入sheet1的第三列
        active_sheet1.cell(row=3, column=3, value=scan_lines_numbers)
        # 将扫描行数写入sheet1的第四列
        active_sheet1.cell(row=3, column=4, value=total_errors_numbers)

    # 创建Sheet2
    active_sheet2 = workbook.create_sheet(title="C_Cpp_test_Details")

    # 添加sheet2的列名
    active_sheet2.cell(row=2, column=1, value="违规")
    active_sheet2.cell(row=2, column=2, value="所在行")
    active_sheet2.cell(row=2, column=3, value="严重度等级")
    active_sheet2.cell(row=2, column=4, value="作者")
    active_sheet2.cell(row=2, column=5, value="rule id")
    active_sheet2.cell(row=2, column=6, value="文件类型")
    active_sheet2.cell(row=2, column=7, value="违规所在文件")

    # 设置A到D列的宽度为20
    for col in range(1, 8):
        active_sheet2.column_dimensions[openpyxl.utils.get_column_letter(col)].width = 30

    # 合并第一行的第一列到第四列
    active_sheet2.merge_cells('A1:G1')
    # 设置合并后单元格的内容
    active_sheet2['A1'] = 'Parasoft C/C++test测试报告-详情'
    # 设置合并后单元格的内容居中
    active_sheet2['A1'].alignment = Alignment(horizontal='center', vertical='center')
    # 设置字体的大小和加粗
    active_sheet2['A1'].font = Font(size=20, bold=True)

    # 从A3开始填充数据
    row_index = 3

    # 循环遍历所有的StdViol节点
    for std_viol_node in root.findall("./CodingStandards/StdViols/StdViol"):
        # 获取当前节点的msg属性值
        msg_value = std_viol_node.get("msg")
        # 获取当前节点的ln属性值
        ln_value = std_viol_node.get("ln")
        # 获取当前节点的sev属性值
        sev_value = std_viol_node.get("sev")
        # 获取当前节点的auth属性值
        auth_value = std_viol_node.get("auth")
        # 获取当前节点的cat属性值
        cat_value = std_viol_node.get("cat")
        # 获取当前节点的lang属性值
        lang_value = std_viol_node.get("lang")
        # 获取当前节点的locFile属性值
        locFile_value = std_viol_node.get("locFile")

        # 将msg属性值填充到Excel表格中，从A3开始
        active_sheet2.cell(row=row_index, column=1, value=msg_value)
        # 将ln属性值填充到Excel表格中
        active_sheet2.cell(row=row_index, column=1 + 1, value=ln_value)
        # 将sev属性值填充到Excel表格中
        active_sheet2.cell(row=row_index, column=1 + 2, value=sev_value)
        # 将auth属性值填充到Excel表格中
        active_sheet2.cell(row=row_index, column=1 + 3, value=auth_value)
        # 将cat属性值填充到Excel表格中
        active_sheet2.cell(row=row_index, column=1 + 4, value=cat_value)
        # 将lang属性值填充到Excel表格中
        active_sheet2.cell(row=row_index, column=1 + 5, value=lang_value)
        # 将locFile属性值填充到Excel表格中
        active_sheet2.cell(row=row_index, column=1 + 6, value=locFile_value)

        # 递增行索引
        row_index += 1

    # 保存Excel文件
    workbook.save(excel_file_path)
    print(f"指定属性和值已成功提取并填充到Sheet1中，Sheet2中：{excel_file_path}")

if __name__ == "__main__":
    xml_file_path = 'C:\\Users\\jackie\\Desktop\\xmlTransferExcel\\version3\\report.xml'
    excel_file_path = 'C:\\Users\\jackie\\Desktop\\xmlTransferExcel\\version3\\output_excel_file.xlsx'
    extract_attributes_to_excel(xml_file_path, excel_file_path)
